package se;

/**
 * 静态优先
 * 父类优先
 * 非静态块优先于构造函数
 */
public class Demo2 {
}

/**
 * 类初始化过程
 * 1.一个类要创建实例需要先加载并初始化该类
 * .mian方法所在的类先加载和初始化
 * 2.一个子类要初始化需要先初始化父类
 * 3.一个类初始化就是执行<clinit>()方法
 * .<clinit>()由静态类变量显示赋值代码和静态代码块组成
 * .类变量显示赋值代码和静态代码块从上而下执行
 * .只执行一次
 * <p>
 * 实例对象初始化过程
 * 1.执行<init>()方法
 * .可能重载多个，有几个构造器就有几个<init>()方法
 * .由非静态实例变量显示赋值代码和非静态代码块，对应构造器代码组成
 * .非静态实例变量显示赋值代码和非静态代码块从上而下执行，对应构造器代码最后执行
 * .每次创建实例对象，调用对应构造器，就是执行<init>方法
 * .<init>方法首行是super()或super(实参列表)默认加上，对应父类的<init>方法
 * <p>
 * 方法重写
 * 1.final方法，静态方法，private等子类中不可见方法
 * 对象多态性
 * .子类如果重写了父类的方法，通过子类对象调用的一定是子类重写的代码
 * .非静态方法默认的调用对象是this
 * .this对象在构造器或者<init>就是正在创建的对象
 */
class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.print("(1)");
    }

    Father() {
        System.out.print("(2)");
    }

    {
        System.out.print("(3)");
    }

    public int test() {
        System.out.print("(4)");
        return 0;
    }

    public static int method() {
        System.out.print("(5)");
        return 0;
    }
}

class Son extends Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.print("(6)");
    }

    Son() {
        System.out.print("(7)");
    }

    {
        System.out.print("(8)");
    }

    public int test() {
        System.out.print("(9)");
        return 0;
    }

    public static int method() {
        System.out.print("(10)");
        return 0;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println();
        Son s2 = new Son();
        Father father = new Father();
        father.test();
    }
}

